﻿using AutoMapper;
using MediatR;
using WMS.API.Application.Command.StocktakingManagement;
using WMS.Domain.Entities.StocktakingManagement;
using WMS.Domain.Entities.SystemUser;
using WMS.ErrorCode;
using WMS.Interfactructure.Interfaces;

namespace WMS.API.Application.CommandHandlers.SystemUser
{
    /// <summary>
    /// 系统用户 - 给客户充值命令处理 - wyx
    /// 职责：接收充值请求，映射参数并执行数据库新增，返回操作结果
    /// </summary>
    public class AddRechargeUserHandlers : IRequestHandler<RechargeUserCommand, APIResult<int>>
    {
        /// <summary>
        /// 充值用户仓储（操作数据库）
        /// </summary>
        private readonly IBaseRepository<RechargeUser> _rechargeUserRepository;
        /// <summary>
        /// 对象映射器（DTO转领域模型）
        /// </summary>
        private readonly IMapper _mapper;
        /// <summary>
        /// 构造注入依赖
        /// </summary>
        /// <param name="rechargeUserRepository">充值用户仓储（操作数据库）</param>
        /// <param name="mapper">对象映射器（DTO转领域模型）</param>
        public AddRechargeUserHandlers(IBaseRepository<RechargeUser> rechargeUserRepository, IMapper mapper)
        {
            _rechargeUserRepository = rechargeUserRepository;
            _mapper = mapper;
        }

        /// <summary>
        /// 处理充值请求核心逻辑
        /// </summary>
        /// <param name="request">充值命令（包含用户编码、金额等参数）</param>
        /// <param name="cancellationToken">取消令牌（用于中断异步操作）</param>
        /// <returns>API统一响应（包含操作结果）</returns>
        public async Task<APIResult<int>> Handle(RechargeUserCommand request, CancellationToken cancellationToken)
        {
            // 1. 初始化API响应
            APIResult<int> res = new APIResult<int>("已为{request.UserCode}用户充值（处理中）")
            {
                Data = 1,
                Code = ResultCode.Success // 先标记业务流程开始
            };

            try
            {
                // 2. 映射命令参数到领域模型（关键修复：用request映射，而非res）
                RechargeUser info = _mapper.Map<RechargeUser>(request);

                // 3. 执行数据库异步新增（必须await，确保入库完成再返回）
                int newId = await _rechargeUserRepository.AddAsync(info);

                // 4. 更新响应结果
                res.Message = $"已为{request.UserCode}用户充值成功，记录ID：{newId}";
                res.Data = newId; // 补充返回新增记录的ID（如果APIResult<int>的Data是ID）
            }
            catch (Exception ex)
            {
                // 5. 捕获异常，标记失败
                res.Data = 0; // 失败时可以设置Data为0或其他标识
                res.Code = ResultCode.Failed;
                res.Message = $"充值失败：{ex.Message}";
                // 可扩展：记录日志、回滚操作等
            }

            // 6. 返回最终响应（天然满足Task<APIResult<int>>类型）
            return res;
        }
    }
}